#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;

int a[N];
int pre[N]; //前缀和数组
int pos[N];// 前缀和第一次出现的位置
//因为前缀和有正有负, 数组下标只有非负, 所以将前缀和 -n ~ n 通过 +n, 映射到数组的 0 ~ 2n
//也就是说: pos[x] 表示的就是前缀和 x - n 第一次出现的位置

int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		if(a[i] == 0) a[i] = -1;
	}
	memset(pos, -1, sizeof pos); //将 pos 初始化成-1, 表示当前前缀和没出现过
	//memset函数，用于将数组所有位置初始化成一个数一般
	//(memset常用的就是初始化成-1, 0, 0x3f3f3f3f(int 最大值) 别乱用, 其他情况很多会出问题)
	pos[n] = 0; 
	int maxn = 0;
	for(int i = 1; i <= n; i++){
		pre[i] = pre[i - 1] + a[i];
		int t = pre[i] + n; //因为前缀和可以是负数，我们将其映射到0 ~ 2n的范围内
		if(pos[t] != -1){ // 如果该前缀和曾经出现过
			maxn = max(maxn, i - pos[t]); // 更新最长平衡子序列长度
		}
		else{
			pos[t] = i; // 如果该前缀和第一次出现，记录当前位置
		} 
	}
	cout << maxn << endl; // 输出结果，即最长平衡子序列的长度
	return 0;
}